"""
编写函数，接收两个正整数作为参数，返回一个元组，其中第一个元素为两个正整数的最大公约数，第二个元素为其最小公倍数，输出最大公约数和最小公倍数。
"""
def demo(m, n):
    p = m * n
    while m % n != 0:
        m, n = n, m % n
    return n, p // n
a = int(input('请输入其中一个整数：'))
b = int(input('请输入另一个整数：'))
c = demo(a, b)
print('{}和{}的最大公约数为{}'.format(a, b, c[0]))
print('{}和{}的最小公倍数为{}'.format(a, b, c[1]))
"""
核心算法：辗转相除法
辗转相除法的原理：两个数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

以12 和 18 为例
初始状态：
m = 12, n = 18
p = m × n = 12 × 18 = 216（保存乘积用于计算最小公倍数）

第一次循环：
条件：m % n = 12 % 18 = 12 ≠ 0（进入循环）
执行：m, n = n, m % n → m=18, n=12

第二次循环：
条件：m % n = 18 % 12 = 6 ≠ 0（进入循环）
执行：m, n = n, m % n → m=12, n=6

第三次循环：
条件：m % n = 12 % 6 = 0（退出循环）

返回结果：
最大公约数 = n = 6
最小公倍数 = p ÷ n = 216 ÷ 6 = 36
"""


"""
编写函数，求三个数中最大值。
"""
def getMax(num1,num2,num3):
    if num1 > num2:
        temp = num1
    else:
        temp = num2
    if temp > num3:
        return "其中最大值为：" + str(temp)
    else:
        return "其中最大值为：" + str(num3)

a = int(input('请输入第1个整数：'))
b = int(input('请输入第2个整数：'))
c = int(input('请输入第3个整数：'))
maxValue = getMax(a, b, c)
print(maxValue)


"""
用递归方法计算S=1+2+3+…+n.
"""
def f(n):
    if n == 1:
        return 1
    else:
        return f(n - 1) + n
n = int(input('请输入一个正整数：'))
print('S=1+2+3+…+n:',f(n))

"""
哥德巴赫猜想：每个不小于 6 的偶数都是两个奇素数之和。编写程序，验证哥德巴赫猜想对20以内的正偶数成立。
"""
def prime(i):							#定义函数，判断i是否为素数
    if i <= 1:						#如果小于等于1，返回0（i不是素数）
        return 0
    if i == 2:						#如果等于2，返回1（i是素数）
        return 1
    for j in range(2, i):			#判断i是否为素数
        if i % j == 0:				#i可以被j除尽，余数为0
            return 0					#返回0，i不是素数
        elif i != j + 1:				#如果i不等于j+1，继续
            continue
        else:
            return 1					#否则，i等于j+1，返回1（i是素数）
n = 0
for i in range(6, 21, 2):
    k = 2
    while k <= i/2:
        j = i - k
        flag1 = prime(k)				#调用prime函数
        if flag1:						#如果k为素数
            flag2 = prime(j)			#调用prime函数
            if flag2:					#如果k和j都是素数
                print(i, '=', k, '+', j)		#输出结果
                n += 1
        k = k + 1
"""
素数就是大于1的自然数，而且它只有1和它自己本身这两个因数
第一步：i = 8
k从2开始，检查到4（因为8/2=4）

第一次循环：k = 2
j = 8 - 2 = 6
prime(2) = 1（2是素数）
prime(6) = 0（6不是素数）
不满足条件，继续

第二次循环：k = 3
j = 8 - 3 = 5
prime(3) = 1（3是素数）
prime(5) = 1（5是素数）
满足条件，输出：8 = 3 + 5

第三次循环：k = 4
j = 8 - 4 = 4
prime(4) = 0（4不是素数）
不满足条件，结束
完整验证结果
程序会依次验证6到20的所有偶数：
6 = 3 + 3
8 = 3 + 5
10 = 3 + 7 或 5 + 5
12 = 5 + 7
14 = 3 + 11 或 7 + 7
16 = 3 + 13 或 5 + 11
18 = 5 + 13 或 7 + 11
20 = 3 + 17 或 7 + 13
"""